#include <reg52.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int

uchar flag,i,pos;

//车辆操作密码
uchar bike_pwd[] = "941010";

uchar code status_cmd_error[]="CMD_ERR";
uchar code status_bikenum_error[]="PWD_ERR";

//车辆状态，0=待使用，1，已预定 2，使用中
uchar bike_status;
uchar code *tool_status[] = {"B_FREE","B_RSVD","B_USING"};
uchar code *tool_error_status[] = {"E_FREE","E_RSVD","E_USING"};
uchar code *tool_ok_status[] = {"O_FREE","O_RSVD","O_USING"};

//LED灯状态，黄灯=待使用，蓝灯=已预定 红灯=使用中
sbit LedYellow = P1^0;
sbit LedBlue = P1^1;
sbit LedRed = P1^2;

uchar container[50];

/****************************
 初始化串口中断参数
******************************/
void InitUART(void){
	SCON = 0x50; //SCON模式1，8位元UART,能够接收数据
	TMOD |=	0x20; //计时器1，TMOD模式2，8位计时计数器，可自动重新载入计数值 （256）
	TH1   = 0xFD;  // TH1:  重装值 9600 波特率 晶振 11.0592MHz
	TR1 = 1;	//计时器1打开
	EA = 1;		//打开总中断
	ES = 1;		//打开串口中断
}

/****************************
 初始化接收容器，和当前位置
******************************/
void InitVar(void){
	for(i=0;i<50;i++){
	   container[i]='\0';
	}
	pos=0;
}

/****************************
 	输出状态
******************************/
void PrintStatus(char *status){
	ES=0;
	TI=1;
	printf(status);
	while(!TI);
	TI=0;
	ES=1;
}

/****************************
 检查车辆编号是不是匹配的
******************************/
uchar IsSameBike(){
	if(container[9]== '#'){
		 for(i=0;i<strlen(bike_pwd);i++){
			if(container[i+3] !=bike_pwd[i]) return 0;
		 }
		 return 1;

	}else{
	   return 0;
	}
}


void lightLed(int ligntIndex){
   	LedYellow=1;
	LedBlue=1;
	LedRed=1;

	switch(ligntIndex){
		case 0:
			LedYellow=0;
			break;
		case 1:
			LedBlue=0;
			break;
		case 2:
			LedRed=0;
			break;
	}
}

void DoQuery(void){
	if(strstr(container,"$CX")){   //查询车辆状态
		if(IsSameBike()== 1){
			PrintStatus(tool_status[bike_status]);
		}else{
			PrintStatus(status_bikenum_error);
		}
	}else if(strstr(container,"$YD")){	//预定车辆
		if(IsSameBike()== 1){
			if(bike_status == 0){
			  bike_status=1;  //更改状态为已预定
			  lightLed(bike_status);
			  PrintStatus(tool_ok_status[bike_status]);	//预定成功
			}else{
			  PrintStatus(tool_error_status[bike_status]);
			}
		}else{
			PrintStatus(status_bikenum_error);
		}
	}else if(strstr(container,"$QX")){	//取消预定车辆
		if(IsSameBike()== 1){
			if(bike_status == 1){
			  bike_status=0;  //更改状态为待使用
			  lightLed(bike_status);
			  PrintStatus(tool_ok_status[bike_status]);	//取消成功
			}else{
			  PrintStatus(tool_error_status[bike_status]);
			}


		}else{
			PrintStatus(status_bikenum_error);
		}
	}else if(strstr(container,"$HC")){	//还车
		if(IsSameBike()== 1){
			if(bike_status == 2){
			  bike_status=0;  //更改状态为待使用
			  lightLed(bike_status);
			  PrintStatus(tool_ok_status[bike_status]);	//还车成功
			}else{
			  PrintStatus(tool_error_status[bike_status]);
			}

		}else{
			PrintStatus(status_bikenum_error);
		}
	}else if(strstr(container,"$KS")){	//车辆开锁
		if(IsSameBike()== 1){
			if(bike_status != 2){
			  bike_status=2;  //更改状态为待使用
			  lightLed(bike_status);
			  PrintStatus(tool_ok_status[bike_status]);	//开锁成功
			}else{
			  PrintStatus(tool_error_status[bike_status]);
			}

		}else{
			PrintStatus(status_bikenum_error);
		}
	}else{		//错误指令
	 	PrintStatus(status_cmd_error);
	}
}


/*********
 主程序
*********/
int main(){
	InitUART();
	InitVar();
	lightLed(0);

	while(1){
		 if(flag==1){

			if(container[pos-1]=='#'){ 	//接收结束
				  DoQuery();

				  InitVar();
				  pos=0;
			}

			flag=0;
		 }
	}
}

/************
 串口中断事件
*************/
void UART_SER(void)	interrupt 4{
	if(RI){		//接收数据，手动将RI清0
	  	RI=0;
		container[pos++]=SBUF;

		if(container[pos-1] == '$'){  //命令开始
			InitVar();
			container[pos++]='$';
		}

		flag =1;
	}

	if(TI){	 //发送数据

	}

}